/**
 * 
 */
package com.monkeyboy.mytest.java8;

import java.util.stream.LongStream;

/**
 * 并行流和串行流计算
 * 主要处理计算密集型的场景
 * @author Gavin<br>
 *         2019年9月26日
 */
public class ParallelStreamDemo {
	// 并行计算n个数的和
	public static long paralleSum(long n) {
		// 这种方式效率比较低，因为涉及到拆箱和装箱的过程
		// return Stream.iterate(1L, i -> i + 1).limit(n).parallel().reduce(0L,
		// Long::sum);
		// 计算量大这种方式是效率最高的
		return LongStream.rangeClosed(0, n).parallel().reduce(0L, Long::sum);
	}

	// 顺序计算，一个线程处理
	public static long sequenceSum(long n) {
		// 效率低
		// return Stream.iterate(1L, i -> i + 1).limit(n).reduce(0L, Long::sum);
		// 计算量小这种方式效率就比较高
		return LongStream.rangeClosed(0, n).reduce(0L, Long::sum);
	}

	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		System.out.println(paralleSum(100000000));
		// System.out.println(sequenceSum(100000000));
		System.out.println(System.currentTimeMillis() - start);
	}
	/**
	 * note：Stream.iterate这种方式计算效率都不较低，比普通的for循环进行计算要低效很多，由于iterate内部很难拆分成
	 * 独立的模块进行计算，另一个原因由于iterate内部需要进行拆箱和装箱这些过程，这是很消耗时间的
	 */
}
